Micron Document
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
| SparkN0de-git | SparkN0de |
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

Node / ReticulumProjects / MeshChatX.git / files / tests / backend / test_plugin_permissions.py

Displaying Raw • Download


tests/backend/test_plugin_permissions.py bce42bcdce0e7d2c6d78228e864a4cd1d974cc82 (bce42bcd) Text, 5.22 KB

T8b949e# SPDX-License-Identifier: 0BSD

Tff7b72import T7ee787io
Tff7b72import T7ee787json
Tff7b72import T7ee787os
Tff7b72import T7ee787zipfile

Tff7b72import T7ee787pytest

Tff7b72from T7ee787meshchatxT7ee787.T7ee787srcT7ee787.T7ee787backendT7ee787.T7ee787plugin_permissions Tff7b72import Tb4b4b4(
Te6edf3collect_network_endpointsTb4b4b4,
Te6edf3declared_permission_idsTb4b4b4,
Te6edf3extract_urls_from_textTb4b4b4,
Te6edf3normalize_granted_permissionsTb4b4b4,
Te6edf3requires_network_fetchTb4b4b4,
Te6edf3validate_declared_permissionsTb4b4b4,
Tb4b4b4)


Tff7b72def Td2a8fftest_declared_permission_ids_and_validationTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3manifest Tff7b72= Tb4b4b4{
Ta5d6ff"Ta5d6ffpermissionsTa5d6ff"Tb4b4b4: Tb4b4b4{
Ta5d6ff"Ta5d6ffhooksTa5d6ff"Tb4b4b4: Tb4b4b4[Ta5d6ff"Ta5d6ffannounce.receivedTa5d6ff"Tb4b4b4]Tb4b4b4,
Ta5d6ff"Ta5d6ffmanagersTa5d6ff"Tb4b4b4: Tb4b4b4[Ta5d6ff"Ta5d6ffdestinationPath.readTa5d6ff"Tb4b4b4]Tb4b4b4,
Ta5d6ff"Ta5d6ffstorageTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffisolatedTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffnetworkTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6fffetchTa5d6ff"Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Ta5d6ff"Ta5d6ffnetworkTa5d6ff"Tb4b4b4: Tb4b4b4{Ta5d6ff"Ta5d6ffendpointsTa5d6ff"Tb4b4b4: Tb4b4b4[Ta5d6ff"Ta5d6ffhttps://example.com/apiTa5d6ff"Tb4b4b4]Tb4b4b4}Tb4b4b4,
Tb4b4b4}
Te6edf3validate_declared_permissionsTb4b4b4(Te6edf3manifestTb4b4b4)
Te6edf3ids Tff7b72= Te6edf3declared_permission_idsTb4b4b4(Te6edf3manifestTb4b4b4)
Tff7b72assert Ta5d6ff"Ta5d6ffhooks:announce.receivedTa5d6ff" Tff7b72in Te6edf3ids
Tff7b72assert Ta5d6ff"Ta5d6ffmanagers:destinationPath.readTa5d6ff" Tff7b72in Te6edf3ids
Tff7b72assert Ta5d6ff"Ta5d6ffstorage:isolatedTa5d6ff" Tff7b72in Te6edf3ids
Tff7b72assert Ta5d6ff"Ta5d6ffnetwork:fetchTa5d6ff" Tff7b72in Te6edf3ids


Tff7b72def Td2a8fftest_unknown_permission_rejectedTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72with Te6edf3pytestTff7b72.Td2a8ffraisesTb4b4b4(Tf85149ValueErrorTb4b4b4, Te6edf3matchTff7b72=Ta5d6ff"Ta5d6ffunknown managerTa5d6ff"Tb4b4b4)Tb4b4b4:
Te6edf3validate_declared_permissionsTb4b4b4(
Tb4b4b4{Ta5d6ff"Ta5d6ffpermissionsTa5d6ff"Tb4b4b4: Tb4b4b4{Ta5d6ff"Ta5d6ffmanagersTa5d6ff"Tb4b4b4: Tb4b4b4[Ta5d6ff"Ta5d6ffnot.a.real.capabilityTa5d6ff"Tb4b4b4]Tb4b4b4}Tb4b4b4}Tb4b4b4,
Tb4b4b4)


Tff7b72def Td2a8fftest_normalize_granted_subsetTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3declared Tff7b72= Tb4b4b4[Ta5d6ff"Ta5d6ffhooks:announce.receivedTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffnetwork:fetchTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffstorage:isolatedTa5d6ff"Tb4b4b4]
Te6edf3granted Tff7b72= Te6edf3normalize_granted_permissionsTb4b4b4(
Te6edf3declaredTb4b4b4,
Tb4b4b4[Ta5d6ff"Ta5d6ffnetwork:fetchTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffhooks:announce.receivedTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffnetwork:fetchTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffxTa5d6ff"Tb4b4b4]Tb4b4b4,
Tb4b4b4)
Tff7b72assert Te6edf3granted Tff7b72== Tb4b4b4[Ta5d6ff"Ta5d6ffnetwork:fetchTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffhooks:announce.receivedTa5d6ff"Tb4b4b4]


Tff7b72def Td2a8fftest_extract_and_collect_network_endpointsTb4b4b4(Te6edf3tmp_pathTb4b4b4)Tb4b4b4:
Te6edf3text Tff7b72= Ta5d6ff'Ta5d6ffconst url = Ta5d6ff"Ta5d6ffhttps://api.example.com/v1Ta5d6ff"Ta5d6ff; fetch(Ta5d6ff"Ta5d6ffhttp://localhost/ignoreTa5d6ff"Ta5d6ff);Ta5d6ff'
Tff7b72assert Te6edf3extract_urls_from_textTb4b4b4(Te6edf3textTb4b4b4) Tff7b72== Tb4b4b4[Ta5d6ff"Ta5d6ffhttps://api.example.com/v1Ta5d6ff"Tb4b4b4]

Te6edf3plugin_dir Tff7b72= Te6edf3tmp_path Tff7b72/ Ta5d6ff"Ta5d6ffpluginTa5d6ff"
Te6edf3plugin_dirTff7b72.Td2a8ffmkdirTb4b4b4(Tb4b4b4)
Tb4b4b4(Te6edf3plugin_dir Tff7b72/ Ta5d6ff"Ta5d6fffrontendTa5d6ff"Tb4b4b4)Tff7b72.Td2a8ffmkdirTb4b4b4(Tb4b4b4)
Tb4b4b4(Te6edf3plugin_dir Tff7b72/ Ta5d6ff"Ta5d6fffrontendTa5d6ff" Tff7b72/ Ta5d6ff"Ta5d6ffmain.jsTa5d6ff"Tb4b4b4)Tff7b72.Td2a8ffwrite_textTb4b4b4(
Ta5d6ff'Ta5d6fffetch(Ta5d6ff"Ta5d6ffhttps://translate.example.org/translateTa5d6ff"Ta5d6ff)Ta5d6ff'Tb4b4b4,
Te6edf3encodingTff7b72=Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4,
Tb4b4b4)
Te6edf3manifest Tff7b72= Tb4b4b4{
Ta5d6ff"Ta5d6ffpermissionsTa5d6ff"Tb4b4b4: Tb4b4b4{Ta5d6ff"Ta5d6ffnetworkTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6fffetchTa5d6ff"Tb4b4b4}Tb4b4b4,
Ta5d6ff"Ta5d6ffnetworkTa5d6ff"Tb4b4b4: Tb4b4b4{
Ta5d6ff"Ta5d6ffendpointsTa5d6ff"Tb4b4b4: Tb4b4b4[
Ta5d6ff"Ta5d6ffhttps://libretranslate.com/Ta5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffUser-configured LibreTranslate instance URLTa5d6ff"Tb4b4b4,
Tb4b4b4]Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Tb4b4b4}
Te6edf3endpoints Tff7b72= Te6edf3collect_network_endpointsTb4b4b4(Te6edf3manifestTb4b4b4, Tffa657strTb4b4b4(Te6edf3plugin_dirTb4b4b4)Tb4b4b4)
Tff7b72assert Ta5d6ff"Ta5d6ffhttps://libretranslate.com/Ta5d6ff" Tff7b72in Te6edf3endpoints
Tff7b72assert Ta5d6ff"Ta5d6ffUser-configured LibreTranslate instance URLTa5d6ff" Tff7b72in Te6edf3endpoints
Tff7b72assert Tffa657anyTb4b4b4(Ta5d6ff"Ta5d6fftranslate.example.orgTa5d6ff" Tff7b72in Te6edf3item Tff7b72for Te6edf3item Tff7b72in Te6edf3endpointsTb4b4b4)
Tff7b72assert Te6edf3requires_network_fetchTb4b4b4(Te6edf3manifestTb4b4b4, Te6edf3endpointsTb4b4b4) Tff7b72is Tff7b72True


Tff7b72def Td2a8fftest_preview_and_install_with_denied_networkTb4b4b4(Te6edf3tmp_pathTb4b4b4)Tb4b4b4:
Tff7b72from T7ee787meshchatxT7ee787.T7ee787srcT7ee787.T7ee787backendT7ee787.T7ee787plugin_manager Tff7b72import Te6edf3PluginManager

Te6edf3source Tff7b72= Te6edf3tmp_path Tff7b72/ Ta5d6ff"Ta5d6ffsrcTa5d6ff"
Te6edf3sourceTff7b72.Td2a8ffmkdirTb4b4b4(Tb4b4b4)
Tb4b4b4(Te6edf3source Tff7b72/ Ta5d6ff"Ta5d6fffrontendTa5d6ff"Tb4b4b4)Tff7b72.Td2a8ffmkdirTb4b4b4(Tb4b4b4)
Tb4b4b4(Te6edf3source Tff7b72/ Ta5d6ff"Ta5d6fffrontendTa5d6ff" Tff7b72/ Ta5d6ff"Ta5d6ffmain.jsTa5d6ff"Tb4b4b4)Tff7b72.Td2a8ffwrite_textTb4b4b4(
Ta5d6ff'Ta5d6ffexport async function activate()Ta5d6ff{Ta5d6ff fetch(Ta5d6ff"Ta5d6ffhttps://evil.example/xTa5d6ff"Ta5d6ff) }Ta5d6ff'Tb4b4b4,
Te6edf3encodingTff7b72=Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4,
Tb4b4b4)
Te6edf3manifest Tff7b72= Tb4b4b4{
Ta5d6ff"Ta5d6ffidTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffcom.example.network-demoTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffversionTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ff1.0.0Ta5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffapiVersionTa5d6ff"Tb4b4b4: T79c0ff1Tb4b4b4,
Ta5d6ff"Ta5d6ffnameTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffNetwork DemoTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6fffrontendTa5d6ff"Tb4b4b4: Tb4b4b4{Ta5d6ff"Ta5d6ffentryTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6fffrontend/main.jsTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6fftypeTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffjsTa5d6ff"Tb4b4b4}Tb4b4b4,
Ta5d6ff"Ta5d6ffpermissionsTa5d6ff"Tb4b4b4: Tb4b4b4{
Ta5d6ff"Ta5d6ffhooksTa5d6ff"Tb4b4b4: Tb4b4b4[Ta5d6ff"Ta5d6ffannounce.receivedTa5d6ff"Tb4b4b4]Tb4b4b4,
Ta5d6ff"Ta5d6ffstorageTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffisolatedTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffnetworkTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6fffetchTa5d6ff"Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Ta5d6ff"Ta5d6ffnetworkTa5d6ff"Tb4b4b4: Tb4b4b4{Ta5d6ff"Ta5d6ffendpointsTa5d6ff"Tb4b4b4: Tb4b4b4[Ta5d6ff"Ta5d6ffhttps://evil.example/Ta5d6ff"Tb4b4b4]Tb4b4b4}Tb4b4b4,
Tb4b4b4}
Tb4b4b4(Te6edf3source Tff7b72/ Ta5d6ff"Ta5d6ffplugin.jsonTa5d6ff"Tb4b4b4)Tff7b72.Td2a8ffwrite_textTb4b4b4(Te6edf3jsonTff7b72.Td2a8ffdumpsTb4b4b4(Te6edf3manifestTb4b4b4)Tb4b4b4, Te6edf3encodingTff7b72=Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4)

Te6edf3buf Tff7b72= Te6edf3ioTff7b72.Td2a8ffBytesIOTb4b4b4(Tb4b4b4)
Tff7b72with Te6edf3zipfileTff7b72.Td2a8ffZipFileTb4b4b4(Te6edf3bufTb4b4b4, Ta5d6ff"Ta5d6ffwTa5d6ff"Tb4b4b4) Tff7b72as Te6edf3archiveTb4b4b4:
Tff7b72for Te6edf3rootTb4b4b4, Te6edf3_dirsTb4b4b4, Te6edf3files Tff7b72in Te6edf3osTff7b72.Td2a8ffwalkTb4b4b4(Te6edf3sourceTb4b4b4)Tb4b4b4:
Tff7b72for Te6edf3name Tff7b72in Te6edf3filesTb4b4b4:
Te6edf3path Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffjoinTb4b4b4(Te6edf3rootTb4b4b4, Te6edf3nameTb4b4b4)
Te6edf3archiveTff7b72.Td2a8ffwriteTb4b4b4(Te6edf3pathTb4b4b4, Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffrelpathTb4b4b4(Te6edf3pathTb4b4b4, Te6edf3sourceTb4b4b4)Tb4b4b4)
Te6edf3payload Tff7b72= Te6edf3bufTff7b72.Td2a8ffgetvalueTb4b4b4(Tb4b4b4)

Te6edf3manager Tff7b72= Te6edf3PluginManagerTb4b4b4(Tffa657strTb4b4b4(Te6edf3tmp_path Tff7b72/ Ta5d6ff"Ta5d6ffstorageTa5d6ff"Tb4b4b4)Tb4b4b4)
Te6edf3preview Tff7b72= Te6edf3managerTff7b72.Td2a8ffpreview_from_zip_bytesTb4b4b4(Te6edf3payloadTb4b4b4)
Tff7b72assert Te6edf3previewTb4b4b4[Ta5d6ff"Ta5d6ffrequires_network_fetchTa5d6ff"Tb4b4b4] Tff7b72is Tff7b72True
Tff7b72assert Ta5d6ff"Ta5d6ffnetwork:fetchTa5d6ff" Tff7b72in Te6edf3previewTb4b4b4[Ta5d6ff"Ta5d6ffpermissionsTa5d6ff"Tb4b4b4]
Tff7b72assert Tffa657anyTb4b4b4(Ta5d6ff"Ta5d6ffevil.exampleTa5d6ff" Tff7b72in Te6edf3item Tff7b72for Te6edf3item Tff7b72in Te6edf3previewTb4b4b4[Ta5d6ff"Ta5d6ffnetwork_endpointsTa5d6ff"Tb4b4b4]Tb4b4b4)

Te6edf3installed Tff7b72= Te6edf3managerTff7b72.Td2a8ffinstall_from_zip_bytesTb4b4b4(
Te6edf3payloadTb4b4b4,
Te6edf3granted_permissionsTff7b72=Tb4b4b4[Ta5d6ff"Ta5d6ffhooks:announce.receivedTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffstorage:isolatedTa5d6ff"Tb4b4b4]Tb4b4b4,
Tb4b4b4)
Tff7b72assert Ta5d6ff"Ta5d6ffnetwork:fetchTa5d6ff" Tff7b72not Tff7b72in Te6edf3installedTb4b4b4[Ta5d6ff"Ta5d6ffgranted_permissionsTa5d6ff"Tb4b4b4]
Tff7b72assert Te6edf3managerTff7b72.Td2a8ffnetwork_fetch_allowedTb4b4b4(Te6edf3installedTb4b4b4[Ta5d6ff"Ta5d6ffidTa5d6ff"Tb4b4b4]Tb4b4b4) Tff7b72is Tff7b72False
Te6edf3managerTff7b72.Td2a8ffenableTb4b4b4(Te6edf3installedTb4b4b4[Ta5d6ff"Ta5d6ffidTa5d6ff"Tb4b4b4]Tb4b4b4)
T8b949e# storage was granted; network was denied
Te6edf3managerTff7b72.Td2a8ffstorage_setTb4b4b4(Te6edf3installedTb4b4b4[Ta5d6ff"Ta5d6ffidTa5d6ff"Tb4b4b4]Tb4b4b4, Ta5d6ff"Ta5d6ffkTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffvTa5d6ff"Tb4b4b4)
Tff7b72assert Te6edf3managerTff7b72.Td2a8ffstorage_getTb4b4b4(Te6edf3installedTb4b4b4[Ta5d6ff"Ta5d6ffidTa5d6ff"Tb4b4b4]Tb4b4b4, Ta5d6ff"Ta5d6ffkTa5d6ff"Tb4b4b4) Tff7b72== Ta5d6ff"Ta5d6ffvTa5d6ff"


Tff7b72def Td2a8fftest_storage_denied_without_grantTb4b4b4(Te6edf3tmp_pathTb4b4b4)Tb4b4b4:
Tff7b72from T7ee787meshchatxT7ee787.T7ee787srcT7ee787.T7ee787backendT7ee787.T7ee787plugin_manager Tff7b72import Te6edf3PluginManager

Te6edf3source Tff7b72= Te6edf3tmp_path Tff7b72/ Ta5d6ff"Ta5d6ffsrcTa5d6ff"
Te6edf3sourceTff7b72.Td2a8ffmkdirTb4b4b4(Tb4b4b4)
Tb4b4b4(Te6edf3source Tff7b72/ Ta5d6ff"Ta5d6ffplugin.jsonTa5d6ff"Tb4b4b4)Tff7b72.Td2a8ffwrite_textTb4b4b4(
Te6edf3jsonTff7b72.Td2a8ffdumpsTb4b4b4(
Tb4b4b4{
Ta5d6ff"Ta5d6ffidTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffcom.example.storage-demoTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffversionTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ff1.0.0Ta5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffapiVersionTa5d6ff"Tb4b4b4: T79c0ff1Tb4b4b4,
Ta5d6ff"Ta5d6ffpermissionsTa5d6ff"Tb4b4b4: Tb4b4b4{Ta5d6ff"Ta5d6ffstorageTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffisolatedTa5d6ff"Tb4b4b4}Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Tb4b4b4)Tb4b4b4,
Te6edf3encodingTff7b72=Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4,
Tb4b4b4)
Te6edf3manager Tff7b72= Te6edf3PluginManagerTb4b4b4(Tffa657strTb4b4b4(Te6edf3tmp_path Tff7b72/ Ta5d6ff"Ta5d6ffstorageTa5d6ff"Tb4b4b4)Tb4b4b4)
Te6edf3installed Tff7b72= Te6edf3managerTff7b72.Td2a8ffinstall_from_directoryTb4b4b4(Tffa657strTb4b4b4(Te6edf3sourceTb4b4b4)Tb4b4b4, Te6edf3granted_permissionsTff7b72=Tb4b4b4[Tb4b4b4]Tb4b4b4)
Te6edf3managerTff7b72.Td2a8ffenableTb4b4b4(Te6edf3installedTb4b4b4[Ta5d6ff"Ta5d6ffidTa5d6ff"Tb4b4b4]Tb4b4b4)
Tff7b72with Te6edf3pytestTff7b72.Td2a8ffraisesTb4b4b4(Tf85149PermissionErrorTb4b4b4)Tb4b4b4:
Te6edf3managerTff7b72.Td2a8ffstorage_setTb4b4b4(Te6edf3installedTb4b4b4[Ta5d6ff"Ta5d6ffidTa5d6ff"Tb4b4b4]Tb4b4b4, Ta5d6ff"Ta5d6ffkTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffvTa5d6ff"Tb4b4b4)


──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────